/**
 * 小程序网络请求工具类
 * 基于wx.request封装，提供类似axios的使用体验
 */

// 获取应用实例
const app = getApp()

// 基础配置
const config = {
  baseURL: 'https://preview1.guducat.laffey.cc', // 生产环境API地址
  timeout: 10000, // 请求超时时间 - 10秒，适合移动端网络环境
  headers: {
    'Content-Type': 'application/json'
  }
}

/**
 * 显示错误提示
 */
const showError = (message) => {
  wx.showToast({
    title: message,
    icon: 'error',
    duration: 2000
  })
}

/**
 * 显示加载提示
 */
const showLoading = (title = '加载中...') => {
  wx.showLoading({
    title: title,
    mask: true
  })
}

/**
 * 隐藏加载提示
 */
const hideLoading = () => {
  wx.hideLoading()
}

/**
 * 统一请求方法
 */
const request = (options) => {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (options.showLoading !== false) {
      showLoading(options.loadingText)
    }

    // 构建完整URL
    const url = options.url.startsWith('http') ? options.url : config.baseURL + options.url

    // 构建请求头
    const headers = {
      ...config.headers,
      ...options.headers
    }

    // 添加token到请求头
    if (app.globalData.token) {
      headers['satoken'] = app.globalData.token
    }

    // 处理请求参数
    let data = options.data || {}
    if (options.method === 'GET' && options.params) {
      data = options.params
    }

    // 发起请求
    wx.request({
      url: url,
      method: options.method || 'GET',
      data: data,
      header: headers,
      timeout: options.timeout || config.timeout,
      success: (res) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          hideLoading()
        }

        console.log(`[Request] ${options.method || 'GET'} ${url}`, {
          params: data,
          response: res
        })

        if (res.statusCode === 200) {
          resolve(res.data)
        } else {
          const errorMsg = res.data?.message || `请求失败: ${res.statusCode}`
          console.error('请求失败:', {
            url: url,
            status: res.statusCode,
            error: res.data
          })
          
          // 处理特殊状态码
          if (res.statusCode === 401) {
            // 登录过期
            showError('登录已过期，请重新登录')
            app.clearUserInfo()
            // 跳转到登录页面
            wx.navigateTo({
              url: '/pages/login/login'
            })
          } else if (options.showError !== false) {
            showError(errorMsg)
          }

          reject({
            code: res.statusCode,
            message: errorMsg,
            data: res.data
          })
        }
      },
      fail: (err) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          hideLoading()
        }

        console.error('网络请求失败:', err)
        
        const errorMsg = '网络错误，请检查连接'
        if (options.showError !== false) {
          showError(errorMsg)
        }

        reject({
          code: -1,
          message: errorMsg,
          error: err
        })
      }
    })
  })
}

/**
 * GET请求
 */
const get = (url, options = {}) => {
  return request({
    url,
    method: 'GET',
    ...options
  })
}

/**
 * POST请求
 */
const post = (url, data, options = {}) => {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  })
}

/**
 * PUT请求
 */
const put = (url, data, options = {}) => {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  })
}

/**
 * DELETE请求
 */
const del = (url, options = {}) => {
  return request({
    url,
    method: 'DELETE',
    ...options
  })
}

/**
 * 上传文件
 */
const uploadFile = (url, filePath, options = {}) => {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (options.showLoading !== false) {
      showLoading('上传中...')
    }

    // 构建完整URL
    const fullUrl = url.startsWith('http') ? url : config.baseURL + url

    // 构建请求头
    const headers = {
      ...options.headers
    }

    // 添加token到请求头
    if (app.globalData.token) {
      headers['satoken'] = app.globalData.token
    }

    wx.uploadFile({
      url: fullUrl,
      filePath: filePath,
      name: options.name || 'file',
      formData: options.formData || {},
      header: headers,
      success: (res) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          hideLoading()
        }

        if (res.statusCode === 200) {
          try {
            const data = JSON.parse(res.data)
            resolve(data)
          } catch (e) {
            resolve(res.data)
          }
        } else {
          const errorMsg = '上传失败'
          if (options.showError !== false) {
            showError(errorMsg)
          }
          reject({
            code: res.statusCode,
            message: errorMsg
          })
        }
      },
      fail: (err) => {
        // 隐藏加载提示
        if (options.showLoading !== false) {
          hideLoading()
        }

        const errorMsg = '上传失败，请检查网络'
        if (options.showError !== false) {
          showError(errorMsg)
        }
        reject({
          code: -1,
          message: errorMsg,
          error: err
        })
      }
    })
  })
}

module.exports = {
  request,
  get,
  post,
  put,
  delete: del,
  upload: uploadFile,
  uploadFile,
  config
}
